package com.techshinogongjian.fp.comm;

import android.util.Log;

public abstract class IComm {

	protected int nTemplateMaxSize = 256; // 特征的最大长度
	protected int nFpImgWidth = 152; // 图像的宽度
	protected int nFpImgHeight = 200; // 图像的高度
	protected int nFpImgMaxSize = nFpImgHeight * nFpImgWidth;
	protected volatile int nCancelFlag = 0;

	private volatile boolean bDevIsBusy = false;

	public synchronized void setBusy(boolean bSetVal) {
		bDevIsBusy = bSetVal;
	}

	public synchronized boolean isBusy() {
		return bDevIsBusy;
	}

	/**
	 * 通信超时： 设备的单条指令的执行最长耗时 功能超时： 某个特定功能完成的预计最长时间，功能可能是由多个指令组合而成，估功能超时应该大于通信超时。
	 */
	protected int nTimeoutOfFunc = 18000; // 取验证指纹的超时限定
	protected int nTimeoutOfComm = 5000; // 单个指令通信超时限定
	protected long lnTmCommEnd = 0; // 通信超时
	protected long lnTmFuncEnd = 0; // 功能超时

	public abstract int read(byte[] pbReadOutBuf, int nStartPos,
			int nWantReadLen);

	public abstract int write(byte[] data);

	public abstract boolean isCancel();

	/**
	 * 判断是否设备通信超时
	 * 
	 * @param nTimeoutKeep
	 * @return
	 */
	protected boolean isCommTimeout(int nTimeoutKeep) {
		if (nTimeoutKeep > 0) {
			nTimeoutOfComm = nTimeoutKeep;
			lnTmCommEnd = System.currentTimeMillis() + nTimeoutKeep;
			return false;
		} else if (nTimeoutKeep == 0) {
			lnTmCommEnd = 0;
			return false;
		} else {
			if (System.currentTimeMillis() > lnTmCommEnd) {
				return true;
			}
			return false;
		}
	}

	protected boolean isCommTimeout() {
		return isCommTimeout(-1);
	}

	/**
	 * 判断是否功能执行超时
	 * 
	 * @param nTimeoutKeep
	 * @return
	 */
	protected boolean isFuncTimeout(int nTimeoutKeep) {
//		Log.e("isFuncTimeout","=="+nTimeoutKeep);
		if (nTimeoutKeep > 0) {
			nTimeoutOfFunc = nTimeoutKeep;
			lnTmFuncEnd = System.currentTimeMillis() + nTimeoutKeep;
//			Log.e("isFuncTimeout","lnTmFuncEnd"+"="+lnTmFuncEnd);
			return false;
		} else if (nTimeoutKeep == 0) {
			lnTmFuncEnd = 0;
			return false;
		} else {
			if (System.currentTimeMillis() > lnTmFuncEnd) {
//				Log.e("isFuncTimeout","System.currentTimeMillis()="+System.currentTimeMillis());
				return true;
			}
			return false;
		}
	}

	protected boolean isFuncTimeout() {
		return isFuncTimeout(-1);
	}

}
